package com.dianshang.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import com.dianshang.dao.UserDao;
import com.dianshang.exception.YZMException;
import com.dianshang.pojo.user.User;
import com.dianshang.service.user.UserService;
import com.dianshang.utils.RedisClient;
import com.dianshang.utils.ValidateCodeUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import java.util.Date;
import java.util.HashMap;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private RedisClient redisClient; // Redis的客户端工具类

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 制作一个验证码,发送到指定的phone上
     *
     * 消息生产者
     */
    @Override
    public void getYZM(String phone) {
        // 1、生成一个验证码
        String yzm = ValidateCodeUtils.generateValidateCode4String(6);
        // 2、验证码保存到本地服务器一份 Redis
        redisClient.set(phone,yzm); // String类型
        redisClient.expire(phone,60); // 60后清空
        // 3、验证码发送给用户的手机号 RabbitMQ 生产者
        HashMap<String,String> msg = new HashMap<>();
        msg.put(phone,yzm); // key——value
        // 第一种方法(前提先把第二种方法里面的配置文件注释掉,要么会导致脏读)：转成json格式
        //  String msgJSON = JSON.toJSONString(msg);
        //  rabbitTemplate.convertAndSend("","dianshang.zhaoyu1",msgJSON);
        // 第二种方法(通过配置文件[applicationContext-producer.xml])：转成json格式
        rabbitTemplate.convertAndSend("","dianshang.zhaoyu1",msg);
    }

    /**
     * 注册
     *    user：用户的信息
     *    yzm：提交的验证码
     */
    @Override
    public void register(User user,String yzm) {
        /**
         * 1、
         *  用户输入的验证与Redis中的验证码进行比较
         */
        Integer count = userDao.selectPhone(user.getPhone()); // 查询手机号是否已注册
        String yzmRedis =(String) redisClient.get(user.getPhone());
        if (yzmRedis == null){
            throw new YZMException("验证码失效！");
        }else if (!yzmRedis.equals(yzm)){
            throw new YZMException("验证码输入有误！");
        }else if (count>0){
            throw new YZMException("该手机号已注册");
        }else {
            /**
             * 2、
             *  匹配继续执行,不匹配直接返回,抛出一个运行时异常
             *  完善或加工处理用户提交的数据
             */
            user.setUsername(user.getPhone()); // 用户名
            BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
            user.setPassword(encoder.encode(user.getPassword())); // 密码，加密存储
            user.setCreated(new Date()); // 创建时间
            user.setUpdated(new Date()); // 修改时间
            user.setPoints(0); // 积分初始值为0
            user.setIsEmailCheck("0"); // 邮箱是否检测（0否  1是）
            user.setSourceType("1"); // 会员来源：1:PC，2：H5，3：Android，4：IOS
            user.setStatus("1"); // 使用状态(1正常 0非正常)
            user.setIsMobileCheck("1"); // 手机是否验证(0否  1是)
            /**
             * 3、
             *  存入数据库
             */
            userDao.insert(user);
        }
    }

    /**
     * 密码加密(BCrypt)
     */
    public static void main(String[] args) {
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        String encode = encoder.encode("123456");
        // 加密后
        System.out.println(encode);
        // 加密后长度
        System.out.println(encode.length());
    }

}